from usuario import Usuario, db_session
from proyecto import Proyecto
from comite import Comite
from historialItem import HistorialItem
from item import Item
from fase import Fase
from sqlalchemy import exc
from flask import flash
session = db_session()

class HistorialManager(object):
    """Clase encargada del manejo del historial de items"""
    def __init__(self):
        pass
    def __repr__(self):
        return '<Historial Manager>'
    
    def guardarHistorialItem(self, historialItem):
        """
        Metodo encargado de almacenar el historial de un item en la base de datos
        @param historialItem: Objeto item que se desea eliminar.
        """
        session.add(historialItem)
        try:
            session.commit()
        except exc.IntegrityError as ex:
            session.rollback()
            return flash("El historial ya existe", "error")
        else:
            return flash("Historial registrado exitosamente")
        
    def eliminarHistorial(self, idhistorial):
        """
        Metodo encargado de eliminar el historial de un item de la base de datos
        @param idhistorial: id del historial que se desea eliminar.
        """
        historialItem = session.query(HistorialItem).filter(HistorialItem.idhistorial==idhistorial).first()
        session.delete(historialItem)
        session.commit()
        
    def getHistorialItem(self, idhistorial):
        """
        Metodo encargado de retornar un historial de la base de datos
        @param idhistorial: id del historial de item que se desea obtener.
        """
        historialItem = session.query(HistorialItem).filter(HistorialItem.idhistorialitem==idhistorial).first()
        return historialItem
    
    def getHistorialesItems(self):
        """Metodo encargado de retornar todos los historiales de la base de datos"""
        historialesItems = session.query(HistorialItem).all()
        return historialesItems
    
    def getHijos(self, historial):
        """
        Metodo encargado de retornar un historial
        @param historial: id del historial cuyos hijos se desean obtener.
        """
        
        hijos = session.query(HistorialItem).filter(HistorialItem.idhistorialitem== historial.idhistorialitem).\
                filter(HistorialItem.iditem)
        return historialItem
    
    def getHistorialItemPorNombre(self, nombre):
        """
        Metodo encargado de retornar un historial dado su nombre
        @param nombre: nombre del historial de item que se desea obtener.
        """
        nombre = session.query(HistorialItem).filter(HistorialItem.nombre==nombre).first()
        return nombre

    
    def getHistorialItemPaginado(self, idfase, nombre, desde, hasta):
        """
        Metodo encargado de retornar el historial paginado de un item
        @param idfase: id de la fase cuyos historiales se desean obtener.
        @param nombre: nombre del historial que se desea obtener.
        @param desde: indica el inicio.
        @param hasta: indica el fin.
        """
        if nombre == "":
            nombre = "%"
        else:
            nombre = "%"+nombre+"%"
#si se le pase una idfase obtiene los items de una fase
        if idfase== None:
            if desde != None and hasta != None:
                historialItems = session.query(HistorialItem).\
                filter(HistorialItem.nombre.like(nombre))[desde:hasta]
                return historialItems
            else:
                total = session.query(HistorialItem).\
                filter(Item.nombre.like(nombre)).count()
                return total

        else:
            if desde != None and hasta != None:
                historialItems = session.query(HistorialItem).filter(HistorialItem.idfase==idfase).\
                filter(HistorialItem.nombre.like(nombre))[desde:hasta]
                return itehistorialItemsms
            else:
                total = session.query(HistorialItem).filter(HistorialItem.idfase==idfase).\
                filter(HistorialItem.nombre.like(nombre)).count()
                return total
            
    def getHistorialItemsDelProyectoPaginado(self, idproyecto, nombre, desde, hasta):
        """
        Metodo encargado de retornar el historial paginado de un item
        @param idproyecto: id del proyecto cuyos historiales se desean obtener.
        @param nombre: nombre del historial que se desea obtener.
        @param desde: indica el inicio.
        @param hasta: indica el fin.
        """
        
        if nombre == "":
            nombre = "%"
        else:
            nombre = "%"+nombre+"%"
#si se le pase una idfase obtiene los items de una fase

        if desde != None and hasta != None:
            historialItems = session.query(HistorialItem).join(Fase).join(Proyecto).\
            filter(Proyecto.idproyecto== idproyecto).\
            filter(HistorialItem.nombre.like(nombre))[desde:hasta]
            return historialItems
        else:
            total = session.query(HistorialItem).join(Fase).join(Proyecto).\
            filter(Proyecto.idproyecto== idproyecto).\
            filter(HistorialItem.nombre.like(nombre)).count()
            return total
        